package org.example;

/**
 * 算式抽象父类：定义所有算式的通用属性和行为
 */
public abstract class AbstractExpression {
    // 运算数1
    protected final int num1;
    // 运算数2
    protected final int num2;
    // 运算结果（子类计算后赋值）
    protected double result;
    // 运算符（子类指定）
    protected char operator;

    /**
     * 构造方法：初始化两个运算数
     * @param num1 第一个运算数
     * @param num2 第二个运算数
     */
    public AbstractExpression(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    /**
     * 抽象方法：计算结果（由子类实现具体运算）
     */
    protected abstract void calculate();

    /**
     * 获取算式字符串（如"2+3"）
     */
    public String getExpressionStr() {
        return num1 + String.valueOf(operator) + num2;
    }

    /**
     * 获取运算结果
     */
    public double getResult() {
        return result;
    }

    /**
     * 验证用户答案是否正确
     * @param answer 用户输入的答案
     * @return 正确返回true，错误返回false
     */
    public boolean checkAnswer(double answer) {
        // 允许浮点数微小误差
        return Math.abs(answer - result) < 0.01;
    }
}
